package main

import (
	"fmt"
	"github.com/google/uuid"
	"log"
	"os"
	"path/filepath"
	"strconv"
)

const TempWorkspaceBaseDir = "./tempFolder/"

// TempWorkspace 临时工作区结构体
type TempWorkspace struct {
	BaseDir string // 基础目录
	UUID    string // 本次操作的UUID
	Path    string // 完整工作路径
}

// NewTempWorkspace 创建新的临时工作区
func NewTempWorkspace(tag string) (*TempWorkspace, error) {
	u := uuid.New().String()
	baseDir := TempWorkspaceBaseDir + tag
	path := filepath.Join(baseDir, u)

	// 模拟创建目录
	fmt.Printf("【TEP】创建临时工作目录: %s\n", path)
	// 创建目录
	if err := os.MkdirAll(path, 0755); err != nil {
		return nil, fmt.Errorf("创建临时工作目录失败: %w", err)
	}

	return &TempWorkspace{
		BaseDir: baseDir,
		UUID:    u,
		Path:    path,
	}, nil
}

// Cleanup 清理工作区
func (tw *TempWorkspace) Cleanup() {
	fmt.Printf("【TEP】清理临时工作目录: %s\n", tw.Path)
	if err := os.RemoveAll(tw.Path); err != nil {
		return
	}
	return
}

// GenerateAttachment 模拟生成附件
func (tw *TempWorkspace) GenerateAttachment(filename string) error {
	filePath := filepath.Join(tw.Path, filename)
	fmt.Printf("【模拟】生成附件: %s\n", filePath)
	fmt.Printf("   附件内容: 这是%s的模拟内容\n", filename)
	return nil
}

// GeneratePDF 模拟生成PDF
func (tw *TempWorkspace) GeneratePDF() (string, error) {
	pdfPath := filepath.Join(tw.Path, "final_voucher.pdf")
	fmt.Printf("【模拟】生成PDF: %s\n", pdfPath)
	fmt.Printf("   PDF内容: 凭证PDF(包含所有附件)\n")
	return pdfPath, nil
}

// MoveToPersistentStorage 模拟移动到持久存储
func (tw *TempWorkspace) MoveToPersistentStorage(srcPath string) error {
	destPath := "/persistent/storage/" + tw.UUID + ".pdf"
	fmt.Printf("【模拟】移动文件:\n   从: %s\n   到: %s\n", srcPath, destPath)
	return nil
}

// GenerateVoucher 生成凭证PDF的示例流程
func GenerateVoucher() error {
	// 1. 创建临时工作区
	fmt.Println("\n=== 开始凭证生成流程 ===")
	workspace, err := NewTempWorkspace("voucher")
	if err != nil {
		return err
	}
	defer workspace.Cleanup() // 确保最后清理

	// 2. 生成各种临时附件
	fmt.Println("\n--- 生成附件 ---")
	attachments := []string{
		"salary.xlsx",   // 工资表
		"inventory.pdf", // 出入库单
		"receipt.jpg",   // 收据
	}

	for i, filename := range attachments {
		if err := workspace.GenerateAttachment("temp" + strconv.Itoa(i) + ".pdf"); err != nil {
			return fmt.Errorf("生成附件 %s 失败: %v", filename, err)
		}
	}

	// 3. 生成最终凭证PDF
	fmt.Println("\n--- 生成PDF ---")
	pdfPath, err := workspace.GeneratePDF()
	if err != nil {
		return fmt.Errorf("生成PDF失败: %v", err)
	}

	// 4. 将最终PDF移动到持久存储
	fmt.Println("\n--- 移动PDF到持久存储 ---")
	if err := workspace.MoveToPersistentStorage(pdfPath); err != nil {
		return fmt.Errorf("移动PDF失败: %v", err)
	}

	fmt.Println("\n=== 凭证生成流程完成 ===")
	return nil
}

func main() {
	fmt.Println("===== 凭证生成模拟程序 =====")
	fmt.Println("说明: 本程序只打印操作步骤，不实际生成文件")

	if err := GenerateVoucher(); err != nil {
		log.Fatalf("生成凭证失败: %v", err)
	}

	fmt.Println("\n操作模拟完成，所有临时文件已清理")
}
